Windows does an ld.s on a tr mapped page.
Currently xen/ipf uses tc/vtlb to emulate guest TR,
that may cause guest ld.s on tr page to be deferred, it is not correct.
For trapping this ld.s intruction, xen/ipf always set machine dcr.dm=0.
Signed-off-by: Anthony Xu <anthony.xu@intel.com>
[Moved cr.dcr restore to only impact vti -> non-vti switch]
Signed-off-by: Alex Williamson <alex.williamson@hp.com>
(void *)vcpu->domain->shared_info,
(void *)vcpu->arch.privregs,
(void *)vcpu->arch.vhpt.hash, pal_vaddr );
- ia64_set_pta(vcpu->arch.arch_vmx.mpta);
+ ia64_set_pta(VMX(vcpu, mpta));
+ ia64_set_dcr(VMX(vcpu, mdcr));
ia64_srlz_d();
ia64_set_psr(psr);
__ia64_save_fpu(prev->arch._thread.fph);
__ia64_load_fpu(next->arch._thread.fph);
- if (VMX_DOMAIN(prev))
- vmx_save_state(prev);
+ if (VMX_DOMAIN(prev)) {
+ vmx_save_state(prev);
+ if (!VMX_DOMAIN(next)) {
+ /* VMX domains can change the physical cr.dcr.
+ * Restore default to prevent leakage. */
+ ia64_setreg(_IA64_REG_CR_DCR, (IA64_DCR_DP | IA64_DCR_DK
+ | IA64_DCR_DX | IA64_DCR_DR | IA64_DCR_PP
+ | IA64_DCR_DA | IA64_DCR_DD | IA64_DCR_LC));
+ }
+ }
if (VMX_DOMAIN(next))
- vmx_load_state(next);
+ vmx_load_state(next);
/*ia64_psr(ia64_task_regs(next))->dfh = !ia64_is_local_fpu_owner(next);*/
prev = ia64_switch_to(next);
{
u64 mdcr, mask;
VCPU(vcpu,dcr)=val;
- /* All vDCR bits will go to mDCR, except for be/pp bit */
+ /* All vDCR bits will go to mDCR, except for be/pp/dm bits */
mdcr = ia64_get_dcr();
- mask = IA64_DCR_BE | IA64_DCR_PP;
+ /* Machine dcr.dm masked to handle guest ld.s on tr mapped page */
+ mask = IA64_DCR_BE | IA64_DCR_PP | IA64_DCR_DM;
mdcr = ( mdcr & mask ) | ( val & (~mask) );
ia64_set_dcr( mdcr);
-
+ VMX(vcpu, mdcr) = mdcr;
return IA64_NO_FAULT;
}
// unsigned long mrr5;
// unsigned long mrr6;
// unsigned long mrr7;
+ unsigned long mdcr;
unsigned long mpta;
// unsigned long rfi_pfs;
// unsigned long rfi_iip;